freeslot("MT_BLACKCRAWLA", "MT_GREENCRAWLA")
freeslot("SPR_GPOS")
freeslot("S_GPOS_STND", "S_GPOS_RUN", "S_GPOS_CHRG", "S_GPOS_MISL", "S_MPOS_CHRG", "S_MPOS_MISL")

mobjinfo[MT_BLACKCRAWLA] = {
	//$Name "Crawla (Black)"
	//$Sprite GPOSA2A8
	//$Category "Rampage Enemies"
	doomednum = 2220,
	spawnstate = S_GPOS_STND,
	spawnhealth = 85,
	seestate = S_GPOS_RUN,
	seesound = sfx_null,
	reactiontime = 1,
	attacksound = sfx_null,
	painstate = S_GPOS_RUN,
	painchance = 8192,
	painsound = sfx_null,
	meleestate = S_GPOS_CHRG,
	missilestate = S_GPOS_CHRG,
	deathstate = S_XPLD_FLICKY,
	xdeathstate = S_NULL,
	deathsound = sfx_pop,
	speed = 3,
	radius = 24*FRACUNIT,
	height = 48*FRACUNIT,
	dispoffset = 0,
	mass = 100,
	damage = 0,
	activesound = sfx_trpowr,
	flags = MF_ENEMY|MF_SPECIAL|MF_SHOOTABLE,
	raisestate = S_NULL
}

mobjinfo[MT_BLACKCRAWLA].bloodcolor = SKINCOLOR_JET
mobjinfo[MT_BLACKCRAWLA].rfwpainchance = 0
mobjinfo[MT_BLACKCRAWLA].deaf = true
mobjinfo[MT_BLACKCRAWLA].sparktype = MT_RFWSPARK

states[S_GPOS_STND] = {
	sprite = SPR_GPOS,
	frame = A,
	tics = 5,
	action = A_Look,
	nextstate = S_GPOS_STND
}

local function A_stupidfakechase(actor, var1, var2)
	A_Chase(actor, nil, nil)
end

states[S_GPOS_RUN] = {
	sprite = SPR_GPOS,
	frame = A|FF_ANIMATE|FF_GLOBALANIM,
	tics = 2,
	var1 = 4,
	var2 = 2,
	action = A_stupidfakechase,
	nextstate = S_GPOS_RUN
}

local function A_GposCharge(actor, var1, var2)
	A_FaceTarget(actor)
	A_PlayActiveSound(actor, var1, var2)
end

states[S_GPOS_CHRG] = {
	sprite = SPR_GPOS,
	frame = I|FF_FULLBRIGHT,
	tics = 30,
	action = A_GposCharge,
	nextstate = S_GPOS_MISL
}

local function A_GposMissile(actor, var1, var2)
	if not (actor.target and actor.target.valid) then
		//print(1)
		actor.state = actor.info.spawnstate
		if ultimatemode then
			actor.reactiontime = actor.info.reactiontime*TICRATE
		else
			actor.reactiontime = actor.info.reactiontime*TICRATE*2
		end
		return
	end
	//local reactiontemp = actor.reactiontime
	actor.reactiontime = 0 //hacky way for us to just use checkmissilerange without having reactiontime effect us
	if (P_CheckSight(actor, actor.target) and R_PointToDist2(actor.x, actor.y, actor.target.x, actor.target.y) <= 4096*FU) or P_RandomRange (1, 20) <= 3 then //15% chance to keep firing per check
		//print(2)
		A_FaceTarget(actor)
		local m = P_SpawnMissile(actor, actor.target, MT_JETTBULLET)
		S_StartSound(m, sfx_trfire)
		if not (m and m.valid) then return end
		local angle = m.angle
		local xyspeed = R_PointToDist2(0, 0, m.momx, m.momy)
		local aim = R_PointToAngle2(0, 0, xyspeed, m.momz)
		local zspeed = m.momz
		local speed = R_PointToDist2(0, 0, xyspeed, zspeed)
		m.momx = FixedMul(FixedMul(speed*3, cos(angle)),cos(aim))
		m.momy = FixedMul(FixedMul(speed*3, sin(angle)),cos(aim))
		m.momz = FixedMul(speed*3, sin(aim))
	else
		//print(3)
		actor.state = actor.info.seestate
		if ultimatemode then
			actor.reactiontime = actor.info.reactiontime*TICRATE
		else
			actor.reactiontime = actor.info.reactiontime*TICRATE*2
		end
	end
end

states[S_GPOS_MISL] = {
	sprite = SPR_GPOS,
	frame = G|FF_ANIMATE|FF_GLOBALANIM|FF_FULLBRIGHT,
	var1 = 1,
	var2 = 2,
	tics = 4,
	action = A_GposMissile,
	nextstate = S_GPOS_MISL
}

mobjinfo[MT_GREENCRAWLA] = {
	//$Name "Crawla (Green)"
	//$Sprite GPOSA2A8
	//$Category "Rampage Enemies"
	doomednum = 2221,
	spawnstate = S_GPOS_STND,
	spawnhealth = 55,
	seestate = S_GPOS_RUN,
	seesound = sfx_null,
	reactiontime = 1,
	attacksound = sfx_null,
	painstate = S_GPOS_RUN,
	painchance = 8192,
	painsound = sfx_null,
	meleestate = S_NULL,
	missilestate = S_MPOS_CHRG,
	deathstate = S_XPLD_FLICKY,
	xdeathstate = S_NULL,
	deathsound = sfx_pop,
	speed = 3,
	radius = 24*FRACUNIT,
	height = 48*FRACUNIT,
	dispoffset = 0,
	mass = 100,
	damage = 0,
	activesound = sfx_trpowr,
	flags = MF_ENEMY|MF_SPECIAL|MF_SHOOTABLE,
	raisestate = S_NULL
}

mobjinfo[MT_GREENCRAWLA].bloodcolor = SKINCOLOR_JET
mobjinfo[MT_GREENCRAWLA].rfwpainchance = 0
mobjinfo[MT_GREENCRAWLA].deaf = true
mobjinfo[MT_GREENCRAWLA].sparktype = MT_RFWSPARK

states[S_MPOS_CHRG] = {
	sprite = SPR_GPOS,
	frame = I|FF_FULLBRIGHT,
	tics = 15,
	action = A_GposCharge,
	nextstate = S_MPOS_MISL
}

local function A_GposShotgun(actor, var1, var2)
	if not (actor.target and actor.target.valid) then
		//print(1)
		actor.state = actor.info.spawnstate
		if ultimatemode then
			actor.reactiontime = actor.info.reactiontime*TICRATE
		else
			actor.reactiontime = actor.info.reactiontime*TICRATE*2
		end
		return
	end
	//local reactiontemp = actor.reactiontime
	actor.reactiontime = 0 //hacky way for us to just use checkmissilerange without having reactiontime effect us
	if (P_CheckSight(actor, actor.target) and R_PointToDist2(actor.x, actor.y, actor.target.x, actor.target.y) <= 4096*FU) or P_RandomRange (1, 20) <= 3 then //15% chance to keep firing per check
		//print(2)
		A_FaceTarget(actor)
		local m = P_SpawnMissile(actor, actor.target, MT_JETTBULLET)
		S_StartSound(m, sfx_trfire)
		if not (m and m.valid) then return end
		local angle = m.angle
		local xyspeed = R_PointToDist2(0, 0, m.momx, m.momy)
		local aim = R_PointToAngle2(0, 0, xyspeed, m.momz)
		local zspeed = m.momz
		local speed = R_PointToDist2(0, 0, xyspeed, zspeed)
		m.momx = FixedMul(FixedMul(speed*3, cos(angle)),cos(aim))
		m.momy = FixedMul(FixedMul(speed*3, sin(angle)),cos(aim))
		m.momz = FixedMul(speed*3, sin(aim))
		local m = P_SpawnMissile(actor, actor.target, MT_JETTBULLET)
		m.momx = FixedMul(FixedMul(speed*3, cos(angle)),cos(aim+ANG1*5))
		m.momy = FixedMul(FixedMul(speed*3, sin(angle)),cos(aim+ANG1*5))
		m.momz = FixedMul(speed*3, sin(aim+ANG1*5))
		local m = P_SpawnMissile(actor, actor.target, MT_JETTBULLET)
		m.momx = FixedMul(FixedMul(speed*3, cos(angle)),cos(aim-ANG1*5))
		m.momy = FixedMul(FixedMul(speed*3, sin(angle)),cos(aim-ANG1*5))
		m.momz = FixedMul(speed*3, sin(aim-ANG1*5))
		local m = P_SpawnMissile(actor, actor.target, MT_JETTBULLET)
		m.momx = FixedMul(FixedMul(speed*3, cos(angle+ANG1*5)),cos(aim))
		m.momy = FixedMul(FixedMul(speed*3, sin(angle+ANG1*5)),cos(aim))
		m.momz = FixedMul(speed*3, sin(aim))
		local m = P_SpawnMissile(actor, actor.target, MT_JETTBULLET)
		m.momx = FixedMul(FixedMul(speed*3, cos(angle-ANG1*5)),cos(aim))
		m.momy = FixedMul(FixedMul(speed*3, sin(angle-ANG1*5)),cos(aim))
		m.momz = FixedMul(speed*3, sin(aim))
		local m = P_SpawnMissile(actor, actor.target, MT_JETTBULLET)
		m.momx = FixedMul(FixedMul(speed*3, cos(angle+ANG10)),cos(aim))
		m.momy = FixedMul(FixedMul(speed*3, sin(angle+ANG10)),cos(aim))
		m.momz = FixedMul(speed*3, sin(aim))
		local m = P_SpawnMissile(actor, actor.target, MT_JETTBULLET)
		m.momx = FixedMul(FixedMul(speed*3, cos(angle-ANG10)),cos(aim))
		m.momy = FixedMul(FixedMul(speed*3, sin(angle-ANG10)),cos(aim))
		m.momz = FixedMul(speed*3, sin(aim))
	else
		//print(3)
		actor.state = actor.info.seestate
		if ultimatemode then
			actor.reactiontime = actor.info.reactiontime*TICRATE
		else
			actor.reactiontime = actor.info.reactiontime*TICRATE*2
		end
	end
end

states[S_MPOS_MISL] = {
	sprite = SPR_GPOS,
	frame = G|FF_FULLBRIGHT,
	tics = 4,
	action = A_GposShotgun,
	nextstate = S_GPOS_RUN
}

addHook("MobjSpawn", function(mo)
	mo.color = SKINCOLOR_FOREST
end, MT_GREENCRAWLA)

addHook("MobjSpawn", function(mo)
	mo.color = SKINCOLOR_BLACK
end, MT_BLACKCRAWLA)